package main

import (
	"errors"
	"fmt"
	"strconv"
	"strings"
	"time"
)

// 闭包与字符串的操作
// 日期和时间的操作
// 系统函数 len new make
// 错误处理
func main() {
	customErrorTest()

}

//自定义错误(异常)
func customErrorTest(){
	err := customError()
	if err != nil {
      fmt.Println("自定义错误:",err)
      panic(err) // 加上该行如果有异常就不会执行下面的代码了
	}
	fmt.Println("上面的代码出现了错误")
}
func customError()(err error){
	var a int = 10
	var b int= 0
	if b == 0 {
		return errors.New("除数不能为0")
	}else{
		result:=a/b
		fmt.Println("结果值为：",result)
		return nil  // 返回值为nil
	}

}

// 错误(异常)处理
func errorFunc() {
	defer func (){
		error:=recover()
		if error != nil {
			fmt.Println("错误已经捕获",error)
		}
	}() // 最后的()表示定义完直接调用
	var a int = 10
	var b int = 0
	fmt.Println(a/b)
}

// 系统函数的使用
func systemFunc(){
  num := new(int) // 开辟一个int的内存空间,返回的是这个空间的地址
  *num=10  // 给这个空间赋值
  fmt.Println(*num) // 该值的打印
}

// 日期和时间的操作
func timeAndDate(){
	now := time.Now()
	// 获取当前的系统时间
	fmt.Println(now)
    // 获取年月日时分秒
    fmt.Println(now.Year(),now.Month(),int(now.Month()),now.Hour(),now.Minute(),now.Second())
	// 日期的格式化
	datestr := fmt.Sprintf("当前年月日： %d-%d-%d 时分秒：%d:%d:%d  \n",now.Year(),now.Month(),
		now.Day(),now.Hour(),now.Minute(),now.Second())
	fmt.Println(datestr)

	//这个参数字符串(2006/01/02 15/04/05)的各个数字必须是固定的，必须这样写
	datestr2 := now.Format("2006/01/02 15/04/05")
	fmt.Println(datestr2)
	//选择任意的组合都是可以的，根据需求自己选择就可以（自己任意组合）。
	datestr3 := now.Format("2006 15:04")
	fmt.Println(datestr3)
}


// 字符串使用函数
func strTest(){
	fmt.Println( strconv.Itoa(66)) // 数字转字符串
	fmt.Println(strconv.Atoi("66"))// 字符串转数字
    fmt.Println(strings.Contains("hello world","lo")) // 判断子串是否在字符串里
    fmt.Println(strings.Count("hello world","o")) // 统计字符串有几个子串
    fmt.Println(strings.EqualFold("hello","HELLO")) // 不区分大小写的字符串比较
    fmt.Println(strings.Index("hello world","llo")) //返回子串第一次出现的索引值
    // 字符串替换 最后一个参数表示替换几个 -1 表示全部替换
    fmt.Println(strings.Replace("golangjavago","go","lang",-1))
	fmt.Println(strings.Replace("golangjavago","go","lang",1))
	// 字符串切割成数组
	fmt.Println(strings.Split("hello-world-java","-"))
    // 大小写转换
    fmt.Println(strings.ToLower("ABC"),strings.ToUpper("abc"))
    // 去掉字符串的空格 以及去掉指定的字符串
    fmt.Println(strings.TrimSpace("  hello   "))
	fmt.Println(strings.Trim("ahelloa","a"))
	// 判断字符串是否以指定的字符串开头和指定的字符串结尾
	fmt.Println(strings.HasPrefix("http://baidu.com","http"),strings.HasSuffix("abc","c"))

}

// 匿名函数+引用的变量/参数 = 闭包 闭包中使用的变量/参数会一直保存在内存中，所以会一直使用---》意味着闭包不可滥用（对内存消耗大）
// 闭包的使用 函数调用函数 调用方式：getSum()(10)
// 闭包应用场景：闭包可以保留上次引用的某个值，我们传入一次就可以反复使用了
func getSum() func (int) int{
	var sum int =10
	return func(a int) int { // 函数可以再通过函数调用
		sum+=a
		return sum
	}
}

// 匿名函数的使用
func lambadaFunc(){
	var sum = func (a int,b int) int {
		return a + b
	}(10,20)
	fmt.Println(sum)

	var minus=func (a int ,b int) int {
		return a-b
	}

	fmt.Println(minus(10,20))
}